iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0
Software Development

從登入到授權-現代軟體的身分架構指南系列 第 2

Day 02|MFA、OTP 與 Passkey:為什麼密碼不夠安全?

  • 分享至 

  • xImage
  •  

前言

上一篇最後提到,單靠密碼有很多風險:密碼可能被外洩、被撞庫、被釣魚,或因為使用者重複使用弱密碼而被猜中。

所以今天先回答第一個問題:如果密碼不夠安全,系統還能怎麼確認「這個人真的是本人」?

這篇會聚焦在 MFA(多因子驗證),並從最常見的 OTP、TOTP,一路講到近年越來越常被討論的 WebAuthn / Passkey。

今天內容涵蓋:

  1. MFA(多因子驗證)到底是什麼
  2. 2FA 跟 MFA 差在哪
  3. 常見 MFA 方法比較
  4. SMS / 語音 OTP 的傳遞通道風險
  5. TOTP 是什麼,以及它怎麼產生與驗證
  6. WebAuthn / Passkey 為什麼是更現代的方向

一、MFA(多因子驗證)到底是什麼?

延續前一篇的科技業工程師例子:他每天登入公司系統時,除了輸入密碼,還要打開手機裡的驗證器 App,輸入一組六位數的動態密碼,才能真正進去。這多出來的一步,就是 MFA(Multi-Factor Authentication,多因子驗證)

MFA 的概念很單純:不要只靠一種方式證明身份,而是同時要求兩種以上不同類型的證據。這些證據通常分成三類:

類型 白話說明 例子
你知道的東西(Something you know) 只有你腦袋裡知道的秘密 密碼、PIN 碼
你擁有的東西(Something you have) 只有你手上才有的實體物品 手機裡的驗證器 App、推播通知(Push Notification)、簡訊 OTP、實體安全金鑰
你本身的特徵(Something you are) 你身體本身的特徵 指紋、臉部辨識

工程師的例子裡,密碼是「你知道的東西」,驗證器 App 產生的動態密碼是「你擁有的東西」——兩種類型都通過,才算完成 MFA。

為什麼一定要「不同類型」,而不是兩個密碼?

因為攻擊者要拿到同一類型的東西,成本差不多。如果系統要求輸入兩組密碼,攻擊者只要透過釣魚或撞庫拿到密碼,兩關一次過。但如果是密碼加上手機裡的驗證器,攻擊者就算拿到密碼外洩資料庫,還得另外偷到使用者的手機,難度完全不同。這也是為什麼 MFA 能大幅降低上一篇提到的密碼外洩、撞庫攻擊等風險。

💡 2FA 跟 MFA 差在哪?

常聽到的 2FA(雙因子驗證),其實是 MFA 的其中一種特例。

2FA 限定使用「剛好兩種」不同類型的驗證因子;MFA 則泛指使用「兩種或以上」的驗證因子。

所以可以理解成:所有 2FA 都屬於 MFA,但 MFA 不一定只有兩種驗證因子。

例如工程師使用「密碼 + 驗證器 App」登入,就是使用兩種不同的驗證因子,因此屬於 2FA,同時也屬於 MFA。


二、常見 MFA 方法比較

雖然都叫 MFA,但不同方法的安全性與使用體驗差很多。實務上選擇哪一種 MFA,不只是在比「有沒有多一道驗證」,也要考慮它是否容易被釣魚、是否依賴電信網路、使用者遺失裝置時能不能安全復原。

方法 屬於哪種因素 優點 風險 / 限制
Email 驗證碼 可存取的帳號 實作簡單、使用者熟悉 Email 被盜時會一起失效
SMS OTP 你擁有的東西 使用門檻低、不需要安裝 App 容易受到 SIM swap、簡訊攔截、電信社工影響
語音 OTP 你擁有的東西 不需要智慧型手機或 App 語音信箱、轉接、電信設定都可能變成弱點
TOTP App 你擁有的東西 不依賴簡訊、較不容易被電信攻擊影響 換手機或遺失裝置時,需要備份碼或復原流程
Push Notification 你擁有的東西 使用體驗好,不用手動輸入代碼 可能被 MFA fatigue / push bombing 攻擊濫用
Security Key / Passkey 你擁有的東西 抗釣魚能力強,使用體驗好 導入成本較高,需要考慮瀏覽器與裝置支援
生物辨識 你本身的特徵 快速、直覺 多半用於本機解鎖裝置或私鑰,不應被理解成網站直接保存你的生物特徵

其中,SMS OTP 或語音 OTP 雖然常見,但不是高安全場景的首選。攻擊者可能透過 SIM swap、電信社工、簡訊攔截,或語音信箱等傳遞通道取得驗證碼。因此,如果系統要保護的是管理後台、金融交易或敏感資料,通常會更建議使用 TOTP、WebAuthn / Passkey 或硬體安全金鑰。

📰 真實案例:LINE 帳號盜用與語音信箱預設密碼

2026 年 3 月 31 日晚間到 4 月 1 日,台灣出現一波 LINE 帳號遭盜用事件。數位發展部後續說明,台灣大哥大調查發現,受影響系統為供部分原台灣之星用戶使用的語音信箱;若用戶沒有修改預設密碼,外人可能透過手機號碼與預設密碼遠端聽取留言,進一步取得 LINE 的語音驗證碼。

流程可以簡化成:

攻擊者嘗試登入 LINE
        ↓
LINE 發送一次性驗證碼(OTP)
        ↓
驗證碼透過語音方式進入語音信箱
        ↓
攻擊者用預設密碼遠端進入語音信箱
        ↓
聽到 OTP
        ↓
完成登入驗證
        ↓
帳號被接管

這個案例的重點不是「OTP 本身被破解」,而是 OTP 的傳遞通道被攻破

也就是說,OTP 就算只有幾分鐘有效,只要攻擊者能同步取得它,仍然可以完成驗證。

這也是為什麼「有 OTP ≠ 一定安全」;安全性還取決於 OTP 是透過 SMS、語音電話、Email 還是 Authenticator App 傳遞,以及這些通道本身是否安全。


三、TOTP:不靠簡訊傳送的一次性密碼

前面提到的 LINE 案例,說明了一件事:OTP 的有效時間再短,只要傳遞通道被攻破,攻擊者還是可能在有效時間內拿到它。所以接下來與其只問「有沒有 MFA」,更應該問的是:第二因素是怎麼送到使用者手上的?這條路安全嗎?

這時候就可以先認識一個比 SMS / 語音 OTP 更常見於 MFA App 的做法:TOTP(Time-based One-Time Password,基於時間的一次性密碼)

TOTP 和 SMS / Email OTP 最大的差別在於:SMS / Email OTP 是伺服器產生一組驗證碼,再透過簡訊或 Email 傳給使用者;TOTP 則是在設定 MFA 時,伺服器和使用者的 Authenticator App 先共享一把 secret,之後雙方各自根據「共享 secret + 當前時間」計算出同一組 6 位數代碼。

也因為 TOTP 是靠時間同步產生,Authenticator App 不需要連上網路,也不需要等伺服器把驗證碼送過來。常見的 TOTP 代碼通常每 30 秒更新一次,過期後就會產生下一組。伺服器驗證時,會用同樣的 secret 和時間區間算出預期的代碼,再跟使用者輸入的代碼比對。

所以和 SMS、語音電話、Email OTP 相比,TOTP 少了一條「把驗證碼送到使用者手上」的傳遞通道,也就比較不容易受到簡訊攔截、語音信箱被入侵或 Email 被盜的影響。不過它仍然不是完美的:如果使用者把即時產生的 TOTP 輸入到釣魚網站,攻擊者仍可能在短時間內拿去完成登入。


四、MFA 登入流程怎麼跑?以 TOTP 為例

理解 TOTP 的原理後,就可以把它放回完整登入流程裡看。

在一個啟用 TOTP MFA 的系統中,登入通常不是「輸入密碼就結束」,而是先完成帳密驗證,再進入第二因素驗證。下面這張圖把完整登入流程和 TOTP 的產生、驗證放在一起看:

https://ithelp.ithome.com.tw/upload/images/20260909/20181928sukCUfYfvh.png

整個流程可以拆成三個角色來看:

  1. User / Browser:先輸入帳號密碼;收到系統要求後,再查看 Authenticator App 顯示的 TOTP,並把代碼輸入登入頁面。
  2. Authenticator App:不需要向伺服器索取驗證碼,而是用本機保存的 shared secret,加上目前的 time step,在本地算出 6 位數 TOTP。
  3. Server:先驗證帳密是否正確;接著用同一把 secret 和同一段 time step 算出預期 TOTP,最後把「使用者輸入的代碼」和「伺服器算出的預期代碼」做比對。

MFA 不是取代密碼,而是在「帳密驗證成功」之後,再多加一道確認本人身份的關卡。


五、從 TOTP 走向 WebAuthn / Passkey

TOTP 已經比 SMS / 語音 OTP 少了一條傳遞通道,但它仍然需要使用者手動切換 App、查看代碼、再輸入回網站。如果使用者被釣魚網站騙到,攻擊者也可能即時拿到這組代碼。

因此近年來更常被討論的是 WebAuthn / Passkey。它不需要使用者手動輸入六位數 OTP,而是透過裝置上的安全憑證與公私鑰機制完成驗證。使用者可能只需要用 Touch ID、Face ID 或裝置 PIN 解鎖,就能完成登入或第二因素驗證。

這裡要特別注意:指紋或臉部資料不會被送到網站伺服器。生物辨識通常只是用來在本機解鎖私鑰;伺服器實際驗證的是由私鑰產生的簽章。

如果把 TOTP 與 WebAuthn / Passkey 放在一起比較,差異會像這樣:

比較項目 TOTP WebAuthn / Passkey
使用者動作 打開驗證器 App,手動輸入 6 位數代碼 使用 Touch ID、Face ID、裝置 PIN 或安全金鑰完成驗證
驗證依據 雙方共享的秘密與目前時間計算出的 OTP 裝置私鑰簽章,伺服器用公鑰驗證
是否容易被釣魚 仍可能被即時釣魚網站騙走 OTP 較能抵抗釣魚,因為憑證通常綁定網域
使用體驗 安全性不錯,但步驟較多 流程較短,使用者體驗較好
導入成本 相對低,支援度高 需要支援 WebAuthn / Passkey 生態與裝置相容性

💡 如果只看使用體驗,TOTP 和 Passkey 都是在「密碼之外」多加一道驗證;但從安全模型來看,兩者其實差很多。

TOTP 驗證的是一組短時間內有效的一次性代碼;Passkey / WebAuthn 驗證的則是由裝置私鑰產生的數位簽章,而且憑證通常會綁定特定網站網域。

因此,相較於 TOTP,Passkey / WebAuthn 對釣魚網站與驗證碼竊取的抵抗能力通常更強。


小結

概念 說明
MFA 用兩種以上不同類型的證據,讓身份驗證更難被攻破
2FA MFA 的一種特例,限定剛好使用兩種因素
OTP 一次性密碼,只能在短時間內使用一次
TOTP 基於時間的一次性密碼,常見於 Authenticator App
WebAuthn / Passkey 透過公私鑰與裝置驗證完成登入或第二因素驗證,抗釣魚能力更好

今天先把「怎麼證明這是本人」講完了。不過驗證成功後,系統還要面對下一個問題:HTTP 本身是無狀態的,伺服器要怎麼在後續每一次請求裡,知道「這仍然是同一個已登入的使用者」?

下一篇會接著看幾種常見的 HTTP 驗證機制:Basic Auth、Digest Auth、API Key,以及 Session-based 登入。


參考資源


上一篇
Day 01|登入按下的那一刻,系統底下做了哪些事?
下一篇
Day 03|HTTP 驗證機制:Basic Auth、Digest Auth、API Key 與 Session
系列文
從登入到授權-現代軟體的身分架構指南3
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言